From: Keir Fraser Date: Tue, 16 Jun 2009 13:04:15 +0000 (+0100) Subject: x86: Allow guests to allocate up to 2MB (superpage) memory extents. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~13757 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success/%22http:/www.example.com/cgi/success?a=commitdiff_plain;h=50f27130b5c3fe5f5f6c7faaf500f6fe5521b8b9;p=xen.git x86: Allow guests to allocate up to 2MB (superpage) memory extents. Signed-off-by: Keir Fraser --- diff --git a/xen/common/memory.c b/xen/common/memory.c index 0dd2b9282f..9717dc2be8 100644 --- a/xen/common/memory.c +++ b/xen/common/memory.c @@ -50,8 +50,7 @@ static void increase_reservation(struct memop_args *a) a->nr_extents-1) ) return; - if ( (a->extent_order != 0) && - !multipage_allocation_permitted(current->domain) ) + if ( !multipage_allocation_permitted(current->domain, a->extent_order) ) return; for ( i = a->nr_done; i < a->nr_extents; i++ ) @@ -96,8 +95,7 @@ static void populate_physmap(struct memop_args *a) a->nr_extents-1) ) return; - if ( (a->extent_order != 0) && - !multipage_allocation_permitted(current->domain) ) + if ( !multipage_allocation_permitted(current->domain, a->extent_order) ) return; for ( i = a->nr_done; i < a->nr_extents; i++ ) @@ -247,8 +245,10 @@ static long memory_exchange(XEN_GUEST_HANDLE(xen_memory_exchange_t) arg) } /* Only privileged guests can allocate multi-page contiguous extents. */ - if ( ((exch.in.extent_order != 0) || (exch.out.extent_order != 0)) && - !multipage_allocation_permitted(current->domain) ) + if ( !multipage_allocation_permitted(current->domain, + exch.in.extent_order) || + !multipage_allocation_permitted(current->domain, + exch.out.extent_order) ) { rc = -EPERM; goto fail_early; diff --git a/xen/include/asm-ia64/iocap.h b/xen/include/asm-ia64/iocap.h index 4f140b8476..ae7a871e0c 100644 --- a/xen/include/asm-ia64/iocap.h +++ b/xen/include/asm-ia64/iocap.h @@ -15,4 +15,9 @@ extern int ioports_deny_access(struct domain *d, #define ioports_access_permitted(d, s, e) \ rangeset_contains_range((d)->arch.ioport_caps, s, e) +#define multipage_allocation_permitted(d, order) \ + (((order) == 0) || \ + !rangeset_is_empty((d)->iomem_caps) || \ + !rangeset_is_empty((d)->arch.ioport_caps)) + #endif /* __IA64_IOCAP_H__ */ diff --git a/xen/include/asm-x86/iocap.h b/xen/include/asm-x86/iocap.h index eee47228d4..591ae17368 100644 --- a/xen/include/asm-x86/iocap.h +++ b/xen/include/asm-x86/iocap.h @@ -18,4 +18,9 @@ (!rangeset_is_empty((d)->iomem_caps) || \ !rangeset_is_empty((d)->arch.ioport_caps)) +#define multipage_allocation_permitted(d, order) \ + (((order) <= 9) || /* allow 2MB superpages */ \ + !rangeset_is_empty((d)->iomem_caps) || \ + !rangeset_is_empty((d)->arch.ioport_caps)) + #endif /* __X86_IOCAP_H__ */ diff --git a/xen/include/xen/iocap.h b/xen/include/xen/iocap.h index c32604d9c9..63bb49f140 100644 --- a/xen/include/xen/iocap.h +++ b/xen/include/xen/iocap.h @@ -28,8 +28,4 @@ #define irq_access_permitted(d, i) \ rangeset_contains_singleton((d)->irq_caps, i) -#define multipage_allocation_permitted(d) \ - (!rangeset_is_empty((d)->iomem_caps) || \ - !rangeset_is_empty((d)->arch.ioport_caps)) - #endif /* __XEN_IOCAP_H__ */